/*
 * DBManagerment.java
 *
 * Copyright© PikaFour!
 */
package DataBase;

import Model.dialog.dlgConfigure;
import Processing.PikaDate;
import Processing.dbclass.*;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLClientInfoException;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.StringTokenizer;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JOptionPane;

/**
 * Class này sẽ chứa tất cả các method cần thiết cho việc thao tác với Database
 * vd: method trả về defaulttablemodel chứa thông tin của tất cả staff, patient,...
 * @author Admin
 */
public class DBManagerment {

    /**
     * Constructor của class DBManagerment
     */
    public DBManagerment() {
    }

    /**
     * Method này sẽ kết nối với MS SQL Database
     * @return Connection với Database
     */
    public static Connection ConnectServer() {
        try {
            //1. Create Driver
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

            FileReader fread = new FileReader(new File("connect.txt"));

            BufferedReader read = new BufferedReader(fread);

            String out = read.readLine();

            StringTokenizer token = new StringTokenizer(out);

            String host = token.nextToken("\t");
            String db = token.nextToken("\t");
            String username = token.nextToken("\t");
            String pass = token.nextToken("\t");

            String conect = "jdbc:sqlserver://";

            conect += host + ";databaseName=" + db;

            //2. Create Connection
            Connection conn = DriverManager.getConnection(conect, username, pass);

            read.close();
            fread.close();

            return conn;
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Can't connect to Database! Please Config first!");
            dlgConfigure config = new dlgConfigure(null, true);
            config.setLocationRelativeTo(null);
            config.setVisible(true);
            return null;
        }
    }

    /**
     * Method này sẽ trả về một PikaTableModel chứa thông tin của tất cả staff
     * @param conn(chuyền vào một Connection)
     * @return trả vè một PikaTableModel
     */
    public PikaTableModel displayStaff(Connection conn) {
        try {
            /**
             * Tạo mới một TableModel của class PikaTableModel
             */
            PikaTableModel model = new PikaTableModel();

            /**
             * Tạo mới statement từ connection
             */
            Statement stmt = conn.createStatement();

            // Câu lệnh truy vấn đến các trường trong bảng Staff
            ResultSet rs = stmt.executeQuery("select [Staff's ID],[Full Name],[User Name],[Department],Convert(varchar(10),[Date Of Join],101) [Date Of Join],[Address],[Phone Number],[Gender],Convert(varchar(10),[Date Of Birth],101) [Date Of Birth],[Education Qualification],[Tech Skill],[Specialization] from displayStaffTable");

            
             // Lấy tất cả title của view bảng Staff đổ vào table
            ResultSetMetaData meta = rs.getMetaData();
            for (int i = 1; i <= meta.getColumnCount(); i++) {
                model.addColumn(meta.getColumnName(i));
            }

            // Lấy tất cả thông tin từng ô đổ vào bảng
            while (rs.next()) {
                /**
                 * Tạo mới vector = row
                 */
                Vector v = new Vector();

                 // Kiểm tra do trường Gender(cột 7) trả về giá trị Male/ Female chứ không phải String
                 // Còn lại add dữ liệu vào các trường tương ứng
                for (int i = 1; i <= 12; i++) {
                    if (i == 8) {
                        if (rs.getString(8).equalsIgnoreCase("1")) {
                            v.addElement("Male");
                        } else {
                            v.addElement("Female");
                        }
                    } else {
                        v.addElement(rs.getString(i));
                    }
                }

                /**
                 * Add row
                 */
                model.addRow(v);
            }
            
            // Ngắt các kết nối tới database
            rs.close();
            stmt.close();

            return model;
            
        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }

    /**
     * Method này sẽ trả về một DefaultTableModel chứa thông tin của tất cả Patient
     * @param conn(chuyền vào một Connection)
     * @return trả vè một DefaultTableModel
     */
    public PikaTableModel displayPatient(Connection conn) {
        try {
            /**
             * Tạo 1 object của class PikaTableModel
             */
            PikaTableModel model = new PikaTableModel();

            /**
             * Tạo mới 1 statement từ Connection
             */
            Statement stmt = conn.createStatement();

            // Truy vấn đến các trường trong bảng Patient
            ResultSet rs = stmt.executeQuery("select [Patient's ID],[Full Name],Convert(varchar(10),[Date Of Birth],101) [Date Of Birth],[Address],[Phone Number],[Gender] from displayPatientTable");

             // Lấy tất cả title của view bảng Staff đổ vào table
            ResultSetMetaData meta = rs.getMetaData();
            
            for (int i = 1; i <= meta.getColumnCount(); i++) {
                model.addColumn(meta.getColumnName(i));
            }

            while (rs.next()) {
                /**
                 * tạo mới vector = row
                 */
                Vector v = new Vector();

                /**
                 * Kiểm tra do trường Gender(cột 6) trả về giá trị male / female chứ không phải là String
                 * Còn lại add dữ liệu vào các trường tương ứng bình thường
                 */
                for (int i = 1; i <= 6; i++) {
                    if (i == 6) {
                        if (rs.getString(6).equalsIgnoreCase("1")) {
                            v.addElement("Male");
                        } else {
                            v.addElement("Female");
                        }
                    } else {
                        v.addElement(rs.getString(i));
                    }
                }

                /**
                 * Add row vào mdel
                 */
                model.addRow(v);
            }

            /**
             * Ngắt các kết nối tới database
             */
            rs.close();
            stmt.close();

            return model;
            
        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }        
    }

    /**
     * Method này sẽ trả về một PikaTableModel chứa thông tin của tất cả TechSkill
     * @param conn(chuyền vào một Connection)
     * @return trả vè một PikaTableModel
     */
    public PikaTableModel displayTechSkill(Connection conn) {
        try {
            /**
             * Tạo 1 object của class PikaTableModel
             */
            PikaTableModel model = new PikaTableModel();

            /**
             * Tạo mới 1 statement từ Connection
             */
            Statement stmt = conn.createStatement();

            /**
             * ???
             */
            ResultSet rs = stmt.executeQuery("select [Tech Skill's ID],[Tech Skill's Name] from displayTechSkillTable");

            /**
             * Lấy tất cả title của view đổ vào table
             */
            ResultSetMetaData meta = rs.getMetaData();
            for (int i = 1; i <= meta.getColumnCount(); i++) {
                model.addColumn(meta.getColumnName(i));
            }

            while (rs.next()) {
                /**
                 * Tạo mới vector = row
                 */
                Vector v = new Vector();

                /**
                 * Add dữ liệu lần lượt vào các trường tương ứng
                 */
                for (int i = 1; i <= 2; i++) {
                    v.addElement(rs.getString(i));
                }

                /**
                 * Add row vào mdel
                 */
                model.addRow(v);              
            }

            /**
             * Ngắt các kết nối tới database
             */
            rs.close();
            stmt.close();

            return model;
            
        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }    
    }

    /**
     * Method này sẽ trả về một PikaTableModel chứa thông tin của tất cả Specialization
     * @param conn(chuyền vào một Connection)
     * @return trả vè một PikaTableModel
     */
    public PikaTableModel displaySpecialization(Connection conn) {
        try {
            /**
             * Tạo 1 object của class PikaTableModel
             */
            PikaTableModel model = new PikaTableModel();

            /**
             * Tạo mới 1 statement từ Connection
             */
            Statement stmt = conn.createStatement();

            /**
             * ???
             */
            ResultSet rs = stmt.executeQuery("select [Specialization's ID],[Specialization's Name] from displaySpecializationTable");

            /**
             * Lấy tất cả title của view đổ vào table
             */
            ResultSetMetaData meta = rs.getMetaData();
            for (int i = 1; i <= meta.getColumnCount(); i++) {
                model.addColumn(meta.getColumnName(i));
            }

            while (rs.next()) {
                /**
                 * Tạo mới vector = row
                 */
                Vector v = new Vector();

                /**
                 * Add dữ liệu lần lượt vào các trường tương ứng
                 */
                for (int i = 1; i <= 2; i++) {
                    v.addElement(rs.getString(i));
                }

                /**
                 * Add row vào mdel
                 */
                model.addRow(v);

                
            }
            /**
             * Ngắt các kết nối tới database
             */
            rs.close();
            stmt.close();

            return model;
            
        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }       
    }

    /**
     * Method này sẽ trả về một PikaTableModel chứa thông tin của tất cả Test
     * @param conn(chuyền vào một Connection)
     * @return trả vè một PikaTableModel
     */
    public PikaTableModel displayTest(Connection conn) {
        try {
            /**
             * Tạo 1 object của class DefaultTableModel
             */
            PikaTableModel model = new PikaTableModel();

            /**
             * Tạo mới 1 statement từ Connection
             */
            Statement stmt = conn.createStatement();

            /**
             * ???
             */
            ResultSet rs = stmt.executeQuery("select [Test's ID],[Test's Name], [Cost] from displayTestTable");

            /**
             * Lấy tất cả title của view đổ vào table
             */
            ResultSetMetaData meta = rs.getMetaData();
            
            for (int i = 1; i <= meta.getColumnCount(); i++) {
                model.addColumn(meta.getColumnName(i));
            }

            while (rs.next()) {
                /**
                 * Tạo mới vector = row
                 */
                Vector v = new Vector();

                /**
                 * Add dữ liệu lần lượt vào các trường tương ứng
                 */
                for (int i = 1; i <= 3; i++) {
                    if (i == 3) {
                        v.addElement(rs.getDouble(i));
                    }else{
                        v.addElement(rs.getString(i));
                    }
                }

                /**
                 * Add row vào mdel
                 */
                model.addRow(v);

                
            }
            /**
             * Ngắt các kết nối tới database
             */
            rs.close();
            stmt.close();

            return model;
            
        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }     
    }

    /**
     * Method này sẽ trả về một PikaTableModel chứa thông tin của tất cả Stock
     * @param conn(chuyền vào một Connection)
     * @return trả vè một PikaTableModel
     */
    public PikaTableModel displayStock(Connection conn) {
        try {
            /**
             * Tạo 1 object của class DefaultTableModel
             */
            PikaTableModel model = new PikaTableModel();

            /**
             * Tạo mới 1 statement từ Connection
             */
            Statement stmt = conn.createStatement();

            // Lệnh truy vấn đến các trường trong bảng
            ResultSet rs = stmt.executeQuery("select [Stock's ID],[Stock's Name],[Cost],[Items Available],[Items Consumed] from displayStockTable");
            
            //Lấy tất cả title của view đổ vào table
            ResultSetMetaData meta = rs.getMetaData();
            for (int i = 1; i <= meta.getColumnCount(); i++) {
                model.addColumn(meta.getColumnName(i));
            }

            while (rs.next()) {
                /**
                 * Tạo mới vector = row
                 */
                Vector v = new Vector();

               
                // Add dữ liệu lần lượt vào các trường tương ứng
                for (int i = 1; i <= 5; i++) {
                    if (i == 3) {
                        v.addElement(rs.getDouble(i));
                    }else{
                        v.addElement(rs.getString(i));
                    }
                }

                /**
                 * Add row vào model
                 */
                model.addRow(v);
                
            }
            /**
             * Ngắt các kết nối tới database
             */
            rs.close();
            stmt.close();

            return model;

        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
       
    }

    /**
     * Method này sẽ trả về một PikaTableModel chứa thông tin của tất cả Bill
     * @param conn(chuyền vào một Connection)
     * @return trả vè một PikaTableModel
     */
    public PikaTableModel displayBill(Connection conn) {
        try {
            /**
             * Tạo 1 object của class DefaultTableModel
             */
            PikaTableModel model = new PikaTableModel();

            /**
             * Tạo mới 1 statement từ Connection
             */
            Statement stmt = conn.createStatement();

            /**
             * ???
             */
            ResultSet rs = stmt.executeQuery("select [Bill's ID], [Patient's ID], [Patient's Name], [Collector's ID], [Collector's ID Name], [Amount], Convert(varchar(10),[Date Made],101) [Date Made], Convert(varchar(10),[Date Paid],101)[Date Paid], [Paid] from displayBillTable");

            /**
             * Lấy tất cả title của view đổ vào table
             */
            ResultSetMetaData meta = rs.getMetaData();
            
            for (int i = 1; i <= meta.getColumnCount(); i++) {
                model.addColumn(meta.getColumnName(i));
            }

            while (rs.next()) {
                /**
                 * Tạo mới vector = row
                 */
                Vector v = new Vector();


                //
                for (int i = 1; i <= 9; i++) {
                    if (i == 9) {
                        if (rs.getString(9).equalsIgnoreCase("1")) {
                            v.addElement("Paid");
                        } else {
                            v.addElement("Not Paid");
                        }
                    } else if(i == 6){
                        v.addElement(rs.getDouble(6));
                    }else {
                        v.addElement(rs.getString(i));
                    }
                }

                /**
                 * Add row vào mdel
                 */
                model.addRow(v);
            }

            /**
             * Ngắt các kết nối tới database
             */
            rs.close();
            stmt.close();

            return model;

        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
        
    }

    /**
     * Method này sẽ trả về một PikaTableModel chứa thông tin của tất cả Report
     * @param conn(chuyền vào một Connection)
     * @return trả vè một PikaTableModel
     */
    public PikaTableModel displayReport(Connection conn) {
        try {
            /**
             * Tạo 1 object của class DefaultTableModel
             */
            PikaTableModel model = new PikaTableModel();

            /**
             * Tạo mới 1 statement từ Connection
             */
            Statement stmt = conn.createStatement();

            /**
             * ???
             */
            ResultSet rs = stmt.executeQuery("select [Report's ID], [Test Purchase ID], [Test's ID], [Test's Name], [Patient's ID], [Patient's Name], [Doctor's ID], [Doctor's Name], Convert(varchar(10),[Date Made],101) [Date Made], [Patient's Report], [Doctor's Report] from displayReportTable");

            /**
             * Lấy tất cả title của view đổ vào table
             */
            ResultSetMetaData meta = rs.getMetaData();
            
            for (int i = 1; i <= meta.getColumnCount(); i++) {
                model.addColumn(meta.getColumnName(i));
            }

            while (rs.next()) {
                /**
                 * Tạo mới vector = row
                 */
                Vector v = new Vector();
                
                /**
                 * Add dữ liệu lần lượt vào các trường tương ứng
                 */
                for (int i = 1; i <= 11; i++) {
                    v.addElement(rs.getString(i));
                }
                
                /**
                 * Add row vào mdel
                 */
                model.addRow(v);

            }
            /**
             * Ngắt các kết nối tới database
             */
            rs.close();
            stmt.close();

            return model;

        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }    
    }

    /**
     * Method này có nhiệm vụ tìm kiềm Staff theo tham số truyền vào(int Search) với:
     * 1-Tìm theo ID
     * 2-Tìm theo Full Name
     * 3-Tìm theo Department
     * 4-Tìm theo Tech Skill
     * 5-Tìm theo Specialization
     * 6-Username
     * @param conn truyền vào Connection
     * @param searchBy chứa lựa chọn tìm kiếm theo cái gì(list ở trên)
     * @param SearchText text tìm kiếm
     * @return PikaTableModel để đổ vào bảng
     */
    public PikaTableModel searchStaff(Connection conn, int searchBy, String SearchText){
        try {
            // Chuỗi chứa lệnh select staff copy từ SQL,
            // ở cuối có thêm "where" sau đó ta sẽ cộng chuỗi để hoàn thành lệnh select
            // Copy và Sửa cái này(copy lệnh select từ SQL vd select Patient)
            String select = "select [Staff's ID],[Full Name],[User Name],[Department],Convert(varchar(10),[Date Of Join],101) [Date Of Join],[Address],[Phone Number],[Gender],Convert(varchar(10),[Date Of Birth],101) [Date Of Birth],[Education Qualification],[Tech Skill],[Specialization] from displayStaffTable where ";

            Statement sttm = conn.createStatement();

            //Tùy vào searchBy được truyền vào mà cộng chuỗi để hoàn thành lệnh select
            // Sau lệnh Switch này ta sẽ có một câu lệnh select chính xác
            // Copy và sửa cái này, xem trên PiakLife xem các bảng khác Search theo cái gì
            // trong combo box(VD: patient có ID, Full Name)
            switch(searchBy){
                case 1: // tìm kiếm theo [Staff's ID]

                    // Như vậy ta sẽ có lệnh select: "...from displayStaffTable where [Staff's ID] = SearchText"
                    // SearchText ở đây là một biến chưa ID cụ thể
                    select += "[Staff's ID]" + " = " + "'" + SearchText + "'";
                    break;
                case 2: // tìm kiếm theo [Full Name]

                    // SearchText ở đây sẽ là một Full Name cụ thể
                    select += "[Full Name]" + " = " + "'" + SearchText + "'";
                    break;
                case 3: // tìm kiếm theo Department

                    select += "[Department]" + " = " + "'" + SearchText + "'";
                    break;
                case 4: // Tìm kiếm theo Tech Skill

                    select += "[Tech Skill]" + " = " + "'" + SearchText + "'";
                    break;
                case 5: // Tìm kiếm theo Specialization

                    select += "[Specialization]" + " = " + "'" + SearchText + "'";
                    break;
                case 6: // Tìm kiếm theo Specialization

                    select += "[User Name]" + " = " + "'" + SearchText + "'";
                    break;
            }

            // Lấy ra ResultSet
            ResultSet rs = sttm.executeQuery(select);
            
            PikaTableModel model = new PikaTableModel();


            // Lấy tất cả title của view đổ vào table
            ResultSetMetaData meta = rs.getMetaData();

            for (int i = 1; i <= meta.getColumnCount(); i++) {
                model.addColumn(meta.getColumnName(i));
            }

            while (rs.next()) {
                //Tạo mới vector = row

                Vector v = new Vector();

                // Add dữ liệu lần lượt vào các trường tương ứng
                // vào SQL chạy select và xem số cột của bảng
                // View displayStaffTable có 11 cột
                // Nhớ copy và sửa cái này
                for (int i = 1; i <= 12; i++) {
                    if (i == 8) {
                        if (rs.getString(8).equalsIgnoreCase("1")) {
                            v.addElement("Male");
                        } else {
                            v.addElement("Female");
                        }
                    } else {
                        v.addElement(rs.getString(i));
                    }
                }

                // Add row vào mdel

                model.addRow(v);

            }

            // Ngắt các kết nối tới database
            rs.close();
            sttm.close();

            return model;

        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }  
        
    }

    /**
     * Method này có nhiệm vụ tìm kiềm Patient theo tham số truyền vào(int Search) với:
     * 1-Tìm theo ID
     * 2-Tìm theo Full Name
     * @param conn truyền vào Connection
     * @param searchBy chứa lựa chọn tìm kiếm theo cái gì(list ở trên)
     * @param SearchText text tìm kiếm
     * @return PikaTableModel để đổ vào bảng
     */
    public PikaTableModel searchPatient(Connection conn, int searchBy, String SearchText) {
        try {
            // Chuỗi chứa lệnh select staff copy từ SQL,
            // ở cuối có thêm "where" sau đó ta sẽ cộng chuỗi để hoàn thành lệnh select
            // Copy và Sửa cái này(copy lệnh select từ SQL vd select Patient)
            String select = "select [Patient's ID],[Full Name],Convert(varchar(10),[Date Of Birth],101) [Date Of Birth],[Address],[Phone Number],[Gender] from displayPatientTable where ";

            Statement sttm = conn.createStatement();

            //Tùy vào searchBy được truyền vào mà cộng chuỗi để hoàn thành lệnh select
            // Sau lệnh Switch này ta sẽ có một câu lệnh select chính xác
            // Copy và sửa cái này, xem trên PiakLife xem các bảng khác Search theo cái gì
            // trong combo box(VD: patient có ID, Full Name)
            switch(searchBy){
                case 1: // tìm kiếm theo [Patient's ID]

                    // Như vậy ta sẽ có lệnh select: "...from displayStaffTable where [Staff's ID] = SearchText"
                    // SearchText ở đây là một biến chưa ID cụ thể
                    select += "[Patient's ID]" + " = " + SearchText;
                    break;
                case 2: // tìm kiếm theo [Full Name]

                    // SearchText ở đây sẽ là một Full Name cụ thể
                    select += "[Full Name]" + " = " + "'" + SearchText + "'";
                    break;
            }

            // Lấy ra ResultSet
            ResultSet rs = sttm.executeQuery(select);

            PikaTableModel model = new PikaTableModel();


            // Lấy tất cả title của view đổ vào table
            ResultSetMetaData meta = rs.getMetaData();

            for (int i = 1; i <= meta.getColumnCount(); i++) {
                model.addColumn(meta.getColumnName(i));
            }

            while (rs.next()) {
                //Tạo mới vector = row

                Vector v = new Vector();

                // Add dữ liệu lần lượt vào các trường tương ứng
                // vào SQL chạy select và xem số cột của bảng
                // View displayStaffTable có 11 cột
                // Nhớ copy và sửa cái này
                for (int i = 1; i <= 6; i++) {
                    if (i == 6) {
                        if (rs.getString(6).equalsIgnoreCase("1")) {
                            v.addElement("Male");
                        } else {
                            v.addElement("Female");
                        }
                    } else {
                        v.addElement(rs.getString(i));
                    }
                }

                // Add row vào mdel

                model.addRow(v);

            }

            // Ngắt các kết nối tới database
            rs.close();
            sttm.close();

            return model;

        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            // Không được xóa cái này
            return null;
        }
    }

    /**
     * Method này có nhiệm vụ tìm kiềm Billing theo tham số truyền vào(int Search) với:
     * 1-Bill's ID
     * 2-Patient's ID
     * 3-Patient's Name
     * 4-Paid/Not Paid
     * 5-Colector ID
     * (Ko cần More...)
     * @param conn truyền vào Connection
     * @param searchBy chứa lựa chọn tìm kiếm theo cái gì(list ở trên)
     * @param SearchText text tìm kiếm
     * @return PikaTableModel để đổ vào bảng
     */
    public PikaTableModel searchBilling(Connection conn, int searchBy, String SearchText) {
        try {
            // Chuỗi chứa lệnh select staff copy từ SQL,
            // ở cuối có thêm "where" sau đó ta sẽ cộng chuỗi để hoàn thành lệnh select
            // Copy và Sửa cái này(copy lệnh select từ SQL vd select Patient)
            String select = "select [Bill's ID], [Patient's ID], [Patient's Name], [Collector's ID], [Collector's ID Name], [Amount], Convert(varchar(10),[Date Made],101) [Date Made], Convert(varchar(10),[Date Paid],101)[Date Paid], [Paid] from displayBillTable where ";

            Statement sttm = conn.createStatement();

            //Tùy vào searchBy được truyền vào mà cộng chuỗi để hoàn thành lệnh select
            // Sau lệnh Switch này ta sẽ có một câu lệnh select chính xác
            // Copy và sửa cái này, xem trên PiakLife xem các bảng khác Search theo cái gì
            // trong combo box(VD: patient có ID, Full Name)
            switch(searchBy){
                case 1: // tìm kiếm theo [Staff's ID]

                    // Như vậy ta sẽ có lệnh select: "...from displayStaffTable where [Staff's ID] = SearchText"
                    // SearchText ở đây là một biến chưa ID cụ thể
                    select += "[Bill's ID]" + " = " + SearchText;
                    break;
                case 2: // tìm kiếm theo [Full Name]

                    // SearchText ở đây sẽ là một Full Name cụ thể
                    select += "[Patient's ID]" + " = " + SearchText;
                    break;
                case 3: // tìm kiếm theo Department

                    select += "[Patient's Name]" + " = " + "'" + SearchText + "'";
                    break;
                case 4: // Tìm kiếm theo Tech Skill

                    select += "[Paid]" + " = " + SearchText;
                    break;
                case 5:
                    select += "[Collector's ID]" + " = " + "'" + SearchText + "'";
                    break;
            }

            // Lấy ra ResultSet
            ResultSet rs = sttm.executeQuery(select);

            PikaTableModel model = new PikaTableModel();


            // Lấy tất cả title của view đổ vào table
            ResultSetMetaData meta = rs.getMetaData();

            for (int i = 1; i <= meta.getColumnCount(); i++) {
                model.addColumn(meta.getColumnName(i));
            }

            while (rs.next()) {
                //Tạo mới vector = row

                Vector v = new Vector();

                // Add dữ liệu lần lượt vào các trường tương ứng
                // vào SQL chạy select và xem số cột của bảng
                // View displayStaffTable có 11 cột
                // Nhớ copy và sửa cái này
                for (int i = 1; i <= 9; i++) {
                    if (i == 9) {
                        if (rs.getString(9).equalsIgnoreCase("1")) {
                            v.addElement("Paid");
                        } else {
                            v.addElement("Not Paid");
                        }
                    } else if(i == 6){
                        v.addElement(rs.getDouble(6));
                    } else {
                        v.addElement(rs.getString(i));
                    }
                }

                // Add row vào mdel

                model.addRow(v);

            }

            // Ngắt các kết nối tới database
            rs.close();
            sttm.close();

            return model;

        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            // Không được xóa cái này
            return null;
        }
    }

    /**
     * Method filter bill theo nhiều yêu cầu
     * @param list truyền vào một list các yêu cầu
     * @param conn truyền vào một Conection
     * @return trả về mội PikaTableModel
     */
    public PikaTableModel searchBillingMore(Connection conn, ArrayList<String> list){
        try {
            // Chuỗi chứa lệnh select Billing copy từ SQL,
            String select = "select [Bill's ID], [Patient's ID], [Patient's Name], [Collector's ID], [Collector's ID Name], [Amount], Convert(varchar(10),[Date Made],101) [Date Made], Convert(varchar(10),[Date Paid],101)[Date Paid], [Paid] from displayBillTable where ";

            // Chỉnh lại chuỗi
            select += list.get(0);
            for (int i = 1; i < list.size(); i++) {
                select += " and " + list.get(i);
            }

            Statement sttm = conn.createStatement();

            // Lấy ra ResultSet
            ResultSet rs = sttm.executeQuery(select);

            PikaTableModel model = new PikaTableModel();


            // Lấy tất cả title của view đổ vào table
            ResultSetMetaData meta = rs.getMetaData();

            for (int i = 1; i <= meta.getColumnCount(); i++) {
                model.addColumn(meta.getColumnName(i));
            }

            while (rs.next()) {
                //Tạo mới vector = row
                Vector v = new Vector();

                // Add dữ liệu lần lượt vào các trường tương ứng
                for (int i = 1; i <= 9; i++) {
                    if (i == 9) {
                        if (rs.getString(9).equalsIgnoreCase("1")) {
                            v.addElement("Paid");
                        } else {
                            v.addElement("Not Paid");
                        }
                    } else if(i == 6){
                        v.addElement(rs.getDouble(6));
                    } else {
                        v.addElement(rs.getString(i));
                    }
                }

                // Add row vào mdel
                model.addRow(v);


            }

            // Ngắt các kết nối tới database
            rs.close();
            sttm.close();

            return model;

        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }

    /**
     * Method này có nhiệm vụ tìm kiềm Report theo tham số truyền vào(int Search) với:
     * 1-Reportl's ID
     * 2-Test
     * 3-Patient's ID
     * 4-Patient's Name
     * 5-Doctor's ID
     * 6-Doctor's Name
     * 7-TestPurchaseID
     * (Ko cần More...)
     * @param conn truyền vào Connection
     * @param searchBy chứa lựa chọn tìm kiếm theo cái gì(list ở trên)
     * @param SearchText text tìm kiếm
     * @return PikaTableModel để đổ vào bảng
     */
    public PikaTableModel searchReport(Connection conn, int searchBy, String SearchText) {
        try {
            // Chuỗi chứa lệnh select staff copy từ SQL,
            // ở cuối có thêm "where" sau đó ta sẽ cộng chuỗi để hoàn thành lệnh select
            // Copy và Sửa cái này(copy lệnh select từ SQL vd select Patient)
            String select = "select [Report's ID], [Test Purchase ID], [Test's ID], [Test's Name], [Patient's ID], [Patient's Name], [Doctor's ID], [Doctor's Name], Convert(varchar(10),[Date Made],101) [Date Made], [Patient's Report], [Doctor's Report] from displayReportTable where ";

            Statement sttm = conn.createStatement();

            //Tùy vào searchBy được truyền vào mà cộng chuỗi để hoàn thành lệnh select
            // Sau lệnh Switch này ta sẽ có một câu lệnh select chính xác
            // Copy và sửa cái này, xem trên PiakLife xem các bảng khác Search theo cái gì
            // trong combo box(VD: patient có ID, Full Name)
            switch(searchBy){
                case 1: // tìm kiếm theo [Staff's ID]

                    // Như vậy ta sẽ có lệnh select: "...from displayStaffTable where [Staff's ID] = SearchText"
                    // SearchText ở đây là một biến chưa ID cụ thể
                    select += "[Report's ID]" + " = " + SearchText;
                    break;
                case 2: // tìm kiếm theo [Full Name]

                    // SearchText ở đây sẽ là một Full Name cụ thể
                    select += "[Test's Name]" + " = " + "'" + SearchText + "'";
                    break;
                case 3: // tìm kiếm theo Department

                    select += "[Patient's ID]" + " = " + SearchText;
                    break;
                case 4: // Tìm kiếm theo Tech Skill

                    select += "[Patient's Name]" + " = " + "'" + SearchText + "'";
                    break;
                case 5: // Tìm kiếm theo Specialization

                    select += "[Doctor's ID]" + " = " + "'" + SearchText + "'";
                    break;
                case 6: // Tìm kiếm theo Specialization

                    select += "[Doctor's Name]" + " = " + "'" + SearchText + "'";
                    break;
                case 7: // Tìm kiếm theo Specialization

                    select += "[Test Purchase ID]" + " = " + SearchText;
                    break;
            }

            // Lấy ra ResultSet
            ResultSet rs = sttm.executeQuery(select);

            PikaTableModel model = new PikaTableModel();


            // Lấy tất cả title của view đổ vào table
            ResultSetMetaData meta = rs.getMetaData();

            for (int i = 1; i <= meta.getColumnCount(); i++) {
                model.addColumn(meta.getColumnName(i));
            }

            while (rs.next()) {
                //Tạo mới vector = row

                Vector v = new Vector();

                // Add dữ liệu lần lượt vào các trường tương ứng
                // vào SQL chạy select và xem số cột của bảng
                // View displayStaffTable có 11 cột
                // Nhớ copy và sửa cái này
                for (int i = 1; i <= 11; i++) {
                    v.addElement(rs.getString(i));
                }

                // Add row vào mdel

                model.addRow(v);

            }

            // Ngắt các kết nối tới database
            rs.close();
            sttm.close();

            return model;

        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            // Không được xóa cái này
            return null;
        }
    }

    /**
     * Method filter Report theo nhiều yêu cầu
     * @param list truyền vào một list các yêu cầu
     * @param conn truyền vào một Conection
     * @return trả về mội PikaTableModel
     */
    public PikaTableModel searchReportMore(Connection conn, ArrayList<String> list){
        try {
            // Chuỗi chứa lệnh select Report copy từ SQL,
            String select = "select [Report's ID], [Test Purchase ID], [Test's ID], [Test's Name], [Patient's ID], [Patient's Name], [Doctor's ID], [Doctor's Name], Convert(varchar(10),[Date Made],101) [Date Made], [Patient's Report], [Doctor's Report] from displayReportTable where ";

            // Chỉnh lại chuỗi
            select += list.get(0);
            for (int i = 1; i < list.size(); i++) {
                select += " and " + list.get(i);
            }

            Statement sttm = conn.createStatement();

            // Lấy ra ResultSet
            ResultSet rs = sttm.executeQuery(select);

            PikaTableModel model = new PikaTableModel();


            // Lấy tất cả title của view đổ vào table
            ResultSetMetaData meta = rs.getMetaData();

            for (int i = 1; i <= meta.getColumnCount(); i++) {
                model.addColumn(meta.getColumnName(i));
            }

            while (rs.next()) {
                //Tạo mới vector = row
                Vector v = new Vector();

                // Add dữ liệu lần lượt vào các trường tương ứng
                for (int i = 1; i <= 11; i++) {
                    v.addElement(rs.getString(i));
                }

                // Add row vào mdel
                model.addRow(v);

            }

            // Ngắt các kết nối tới database
            rs.close();
            sttm.close();

            return model;

        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }

    /**
     * Method này có nhiệm vụ tìm kiềm Test theo tham số truyền vào(int Search) với:
     * 1-Tìm theo ID
     * 2-Tìm theo Name
     * 3-Tìm theo Cost
     * @param conn truyền vào Connection
     * @param searchBy chứa lựa chọn tìm kiếm theo cái gì(list ở trên)
     * @param SearchText text tìm kiếm
     * @return PikaTableModel để đổ vào bảng
     */
    public PikaTableModel searchTest(Connection conn, int searchBy, String SearchText) {
        try {
            // Chuỗi chứa lệnh select staff copy từ SQL,
            // ở cuối có thêm "where" sau đó ta sẽ cộng chuỗi để hoàn thành lệnh select
            // Copy và Sửa cái này(copy lệnh select từ SQL vd select Patient)
            String select = "select [Test's ID],[Test's Name], [Cost] from displayTestTable where ";

            Statement sttm = conn.createStatement();

            //Tùy vào searchBy được truyền vào mà cộng chuỗi để hoàn thành lệnh select
            // Sau lệnh Switch này ta sẽ có một câu lệnh select chính xác
            // Copy và sửa cái này, xem trên PiakLife xem các bảng khác Search theo cái gì
            // trong combo box(VD: patient có ID, Full Name)
            switch(searchBy){
                case 1: // tìm kiếm theo [Patient's ID]

                    // Như vậy ta sẽ có lệnh select: "...from displayStaffTable where [Staff's ID] = SearchText"
                    // SearchText ở đây là một biến chưa ID cụ thể
                    select += "[Test's ID]" + " = " + "'" + SearchText + "'";
                    break;
                case 2: // tìm kiếm theo [Full Name]

                    // SearchText ở đây sẽ là một Full Name cụ thể
                    select += "[Test's Name]" + " = " + "'" + SearchText + "'";
                    break;
                case 3:
                    select += SearchText;
                    break;
            }

            // Lấy ra ResultSet
            ResultSet rs = sttm.executeQuery(select);

            PikaTableModel model = new PikaTableModel();


            // Lấy tất cả title của view đổ vào table
            ResultSetMetaData meta = rs.getMetaData();

            for (int i = 1; i <= meta.getColumnCount(); i++) {
                model.addColumn(meta.getColumnName(i));
            }

            while (rs.next()) {
                //Tạo mới vector = row

                Vector v = new Vector();

                // Add dữ liệu lần lượt vào các trường tương ứng
                // vào SQL chạy select và xem số cột của bảng
                // View displayStaffTable có 11 cột
                // Nhớ copy và sửa cái này
                for (int i = 1; i <= 3; i++) {
                    if (i == 3) {
                        v.addElement(rs.getDouble(i));
                    }else{
                        v.addElement(rs.getString(i));
                    }
                }

                // Add row vào mdel

                model.addRow(v);

            }

            // Ngắt các kết nối tới database
            rs.close();
            sttm.close();

            return model;

        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            // Không được xóa cái này
            return null;
        }
    }

    /**
     * Method này có nhiệm vụ tìm kiềm Stock theo tham số truyền vào(int Search) với:
     * 1-Tìm theo ID
     * 2-Tìm theo Name
     * @param conn truyền vào Connection
     * @param searchBy chứa lựa chọn tìm kiếm theo cái gì(list ở trên)
     * @param SearchText text tìm kiếm
     * @return PikaTableModel để đổ vào bảng
     */
    public PikaTableModel searchStock(Connection conn, int searchBy, String SearchText) {
        try {
            // Chuỗi chứa lệnh select staff copy từ SQL,
            // ở cuối có thêm "where" sau đó ta sẽ cộng chuỗi để hoàn thành lệnh select
            // Copy và Sửa cái này(copy lệnh select từ SQL vd select Patient)
            String select = "select [Stock's ID],[Stock's Name],[Cost],[Items Available],[Items Consumed] from displayStockTable where ";

            Statement sttm = conn.createStatement();

            //Tùy vào searchBy được truyền vào mà cộng chuỗi để hoàn thành lệnh select
            // Sau lệnh Switch này ta sẽ có một câu lệnh select chính xác
            // Copy và sửa cái này, xem trên PiakLife xem các bảng khác Search theo cái gì
            // trong combo box(VD: patient có ID, Full Name)
            switch(searchBy){
                case 1: // tìm kiếm theo [Patient's ID]

                    // Như vậy ta sẽ có lệnh select: "...from displayStaffTable where [Staff's ID] = SearchText"
                    // SearchText ở đây là một biến chưa ID cụ thể
                    select += "[Stock's ID]" + " = " + "'" + SearchText + "'";
                    break;
                case 2: // tìm kiếm theo [Full Name]

                    // SearchText ở đây sẽ là một Full Name cụ thể
                    select += "[Stock's Name]" + " = " + "'" + SearchText + "'";
                    break;
            }

            // Lấy ra ResultSet
            ResultSet rs = sttm.executeQuery(select);

            PikaTableModel model = new PikaTableModel();


            // Lấy tất cả title của view đổ vào table
            ResultSetMetaData meta = rs.getMetaData();

            for (int i = 1; i <= meta.getColumnCount(); i++) {
                model.addColumn(meta.getColumnName(i));
            }

            while (rs.next()) {
                //Tạo mới vector = row

                Vector v = new Vector();

                // Add dữ liệu lần lượt vào các trường tương ứng
                // vào SQL chạy select và xem số cột của bảng
                // View displayStaffTable có 11 cột
                // Nhớ copy và sửa cái này
                for (int i = 1; i <= 5; i++) {
                    if (i == 3) {
                        v.addElement(rs.getDouble(i));
                    }else{
                        v.addElement(rs.getString(i));
                    }
                }

                // Add row vào mdel

                model.addRow(v);

            }

            // Ngắt các kết nối tới database
            rs.close();
            sttm.close();

            return model;

        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            // Không được xóa cái này
            return null;
        }
    }

    /**
     * Method filter bill theo nhiều yêu cầu
     * @param list truyền vào một list các yêu cầu
     * @param conn truyền vào một Conection
     * @return trả về mội PikaTableModel
     */
    public PikaTableModel searchStockMore(Connection conn, ArrayList<String> list){
        try {
            // Chuỗi chứa lệnh select Billing copy từ SQL,
            String select = "select [Stock's ID],[Stock's Name],[Cost],[Items Available],[Items Consumed] from displayStockTable where ";

            // Chỉnh lại chuỗi
            select += list.get(0);
            for (int i = 1; i < list.size(); i++) {
                select += " and " + list.get(i);
            }

            Statement sttm = conn.createStatement();

            // Lấy ra ResultSet
            ResultSet rs = sttm.executeQuery(select);

            PikaTableModel model = new PikaTableModel();


            // Lấy tất cả title của view đổ vào table
            ResultSetMetaData meta = rs.getMetaData();

            for (int i = 1; i <= meta.getColumnCount(); i++) {
                model.addColumn(meta.getColumnName(i));
            }

            while (rs.next()) {
                //Tạo mới vector = row

                Vector v = new Vector();

                // Add dữ liệu lần lượt vào các trường tương ứng
                // vào SQL chạy select và xem số cột của bảng
                // View displayStaffTable có 11 cột
                // Nhớ copy và sửa cái này
                for (int i = 1; i <= 5; i++) {
                    if (i == 3) {
                        v.addElement(rs.getDouble(i));
                    }else{
                        v.addElement(rs.getString(i));
                    }
                }

                // Add row vào mdel

                model.addRow(v);

            }

            // Ngắt các kết nối tới database
            rs.close();
            sttm.close();

            return model;

        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }

    /**
     * Method này có nhiệm vụ tìm kiềm TechSkill theo tham số truyền vào(int Search) với:
     * 1-Tìm theo ID
     * 2-Tìm theo Name
     * @param conn truyền vào Connection
     * @param searchBy chứa lựa chọn tìm kiếm theo cái gì(list ở trên)
     * @param SearchText text tìm kiếm
     * @return PikaTableModel để đổ vào bảng
     */
    public PikaTableModel searchTechSkill(Connection conn, int searchBy, String SearchText) {
        try {
            // Chuỗi chứa lệnh select staff copy từ SQL,
            // ở cuối có thêm "where" sau đó ta sẽ cộng chuỗi để hoàn thành lệnh select
            // Copy và Sửa cái này(copy lệnh select từ SQL vd select Patient)
            String select = "select [Tech Skill's ID],[Tech Skill's Name] from displayTechSkillTable where ";

            Statement sttm = conn.createStatement();

            //Tùy vào searchBy được truyền vào mà cộng chuỗi để hoàn thành lệnh select
            // Sau lệnh Switch này ta sẽ có một câu lệnh select chính xác
            // Copy và sửa cái này, xem trên PiakLife xem các bảng khác Search theo cái gì
            // trong combo box(VD: patient có ID, Full Name)
            switch(searchBy){
                case 1: // tìm kiếm theo [Patient's ID]

                    // Như vậy ta sẽ có lệnh select: "...from displayStaffTable where [Staff's ID] = SearchText"
                    // SearchText ở đây là một biến chưa ID cụ thể
                    select += "[Tech Skill's ID]" + " = " + "'" + SearchText + "'";
                    break;
                case 2: // tìm kiếm theo [Full Name]

                    // SearchText ở đây sẽ là một Full Name cụ thể
                    select += "[Tech Skill's Name]" + " = " + "'" + SearchText + "'";
                    break;
            }

            // Lấy ra ResultSet
            ResultSet rs = sttm.executeQuery(select);

            PikaTableModel model = new PikaTableModel();


            // Lấy tất cả title của view đổ vào table
            ResultSetMetaData meta = rs.getMetaData();

            for (int i = 1; i <= meta.getColumnCount(); i++) {
                model.addColumn(meta.getColumnName(i));
            }

            while (rs.next()) {
                //Tạo mới vector = row

                Vector v = new Vector();

                // Add dữ liệu lần lượt vào các trường tương ứng
                // vào SQL chạy select và xem số cột của bảng
                // View displayStaffTable có 11 cột
                // Nhớ copy và sửa cái này
                for (int i = 1; i <= 2; i++) {
                    v.addElement(rs.getString(i));
                }

                // Add row vào mdel

                model.addRow(v);

            }

            // Ngắt các kết nối tới database
            rs.close();
            sttm.close();

            return model;

        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            // Không được xóa cái này
            return null;
        }
    }

    /**
     * Method này có nhiệm vụ tìm kiềm Specialization theo tham số truyền vào(int Search) với:
     * 1-Tìm theo ID
     * 2-Tìm theo Name
     * @param conn truyền vào Connection
     * @param searchBy chứa lựa chọn tìm kiếm theo cái gì(list ở trên)
     * @param SearchText text tìm kiếm
     * @return PikaTableModel để đổ vào bảng
     */
    public PikaTableModel searchSpecialization(Connection conn, int searchBy, String SearchText) {
        try {
            // Chuỗi chứa lệnh select staff copy từ SQL,
            // ở cuối có thêm "where" sau đó ta sẽ cộng chuỗi để hoàn thành lệnh select
            // Copy và Sửa cái này(copy lệnh select từ SQL vd select Patient)
            String select = "select [Specialization's ID],[Specialization's Name] from displaySpecializationTable where ";

            Statement sttm = conn.createStatement();

            //Tùy vào searchBy được truyền vào mà cộng chuỗi để hoàn thành lệnh select
            // Sau lệnh Switch này ta sẽ có một câu lệnh select chính xác
            // Copy và sửa cái này, xem trên PiakLife xem các bảng khác Search theo cái gì
            // trong combo box(VD: patient có ID, Full Name)
            switch(searchBy){
                case 1: // tìm kiếm theo [Patient's ID]

                    // Như vậy ta sẽ có lệnh select: "...from displayStaffTable where [Staff's ID] = SearchText"
                    // SearchText ở đây là một biến chưa ID cụ thể
                    select += "[Specialization's ID]" + " = " + "'" + SearchText + "'";
                    break;
                case 2: // tìm kiếm theo [Full Name]

                    // SearchText ở đây sẽ là một Full Name cụ thể
                    select += "[Specialization's Name]" + " = " + "'" + SearchText + "'";
                    break;
            }

            // Lấy ra ResultSet
            ResultSet rs = sttm.executeQuery(select);

            PikaTableModel model = new PikaTableModel();


            // Lấy tất cả title của view đổ vào table
            ResultSetMetaData meta = rs.getMetaData();

            for (int i = 1; i <= meta.getColumnCount(); i++) {
                model.addColumn(meta.getColumnName(i));
            }

            while (rs.next()) {
                //Tạo mới vector = row

                Vector v = new Vector();

                // Add dữ liệu lần lượt vào các trường tương ứng
                // vào SQL chạy select và xem số cột của bảng
                // View displayStaffTable có 11 cột
                // Nhớ copy và sửa cái này
                for (int i = 1; i <= 2; i++) {
                    v.addElement(rs.getString(i));
                }

                // Add row vào model
                model.addRow(v);

            }

            // Ngắt các kết nối tới database
            rs.close();
            sttm.close();

            return model;

        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            // Không được xóa cái này
            return null;
        }
    }

    /**
     * Method này có nhiệm vụ tìm kiềm TestPurchase theo BillID
     * @param conn truyền vào Connection
     * @param BillID truyền vào BillID
     * @return trả về PikaTableModel chưa tất cả TestPurchase
     */
    public PikaTableModel searchTestPurchase(Connection conn, String BillID){
        try {
            // Chuỗi chứa lệnh select staff copy từ SQL,
            // ở cuối có thêm "where" sau đó ta sẽ cộng chuỗi để hoàn thành lệnh select
            // Copy và Sửa cái này(copy lệnh select từ SQL vd select Patient)
            String select = "select [Test Purchase's ID],[Bill's ID],[Test's ID],[Test's Name],[Amount],[Date Purchase] from displayTestPurchaseTable where ";

            Statement sttm = conn.createStatement();

            select += "[Bill's ID] = " + "'" +  BillID + "'";

            // Lấy ra ResultSet
            ResultSet rs = sttm.executeQuery(select);

            PikaTableModel model = new PikaTableModel();


            // Lấy tất cả title của view đổ vào table
            ResultSetMetaData meta = rs.getMetaData();

            for (int i = 1; i <= meta.getColumnCount(); i++) {
                model.addColumn(meta.getColumnName(i));
            }

            while (rs.next()) {
                //Tạo mới vector = row

                Vector v = new Vector();

                // Add dữ liệu lần lượt vào các trường tương ứng
                // vào SQL chạy select và xem số cột của bảng
                // View displayStaffTable có 11 cột
                // Nhớ copy và sửa cái này
                for (int i = 1; i <= 6; i++) {
                    if (i == 5) {
                        v.addElement(rs.getDouble(i));
                    }else{
                        v.addElement(rs.getString(i));
                    }
                }

                // Add row vào model
                model.addRow(v);

            }

            // Ngắt các kết nối tới database
            rs.close();
            sttm.close();

            return model;

        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            // Không được xóa cái này
            return null;
        }
    }

    /**
     * Method này có nhiệm vụ tìm kiềm TestPurchase theo BillID
     * @param conn truyền vào Connection
     * @param BillID truyền vào BillID
     * @return trả về PikaTableModel chưa tất cả TestPurchase
     */
    public PikaTableModel searchTestPurchaseByID(Connection conn, int testPurchaseID){
        try {
            // Chuỗi chứa lệnh select staff copy từ SQL,
            // ở cuối có thêm "where" sau đó ta sẽ cộng chuỗi để hoàn thành lệnh select
            // Copy và Sửa cái này(copy lệnh select từ SQL vd select Patient)
            String select = "select [Test Purchase's ID],[Bill's ID],[Test's ID],[Test's Name],[Amount],[Date Purchase] from displayTestPurchaseTable where ";

            Statement sttm = conn.createStatement();

            select += "[Test Purchase's ID] = " +  testPurchaseID;

            // Lấy ra ResultSet
            ResultSet rs = sttm.executeQuery(select);

            PikaTableModel model = new PikaTableModel();


            // Lấy tất cả title của view đổ vào table
            ResultSetMetaData meta = rs.getMetaData();

            for (int i = 1; i <= meta.getColumnCount(); i++) {
                model.addColumn(meta.getColumnName(i));
            }

            while (rs.next()) {
                //Tạo mới vector = row

                Vector v = new Vector();

                // Add dữ liệu lần lượt vào các trường tương ứng
                // vào SQL chạy select và xem số cột của bảng
                // View displayStaffTable có 11 cột
                // Nhớ copy và sửa cái này
                for (int i = 1; i <= 6; i++) {
                    if (i == 5) {
                        v.addElement(rs.getDouble(i));
                    }else{
                        v.addElement(rs.getString(i));
                    }
                }

                // Add row vào model
                model.addRow(v);

            }

            // Ngắt các kết nối tới database
            rs.close();
            sttm.close();

            return model;

        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            // Không được xóa cái này
            return null;
        }
    }

    /**
     * Method này có nhiệm vụ tìm kiềm StockPurchase theo BillID
     * @param conn truyền vào Connection
     * @param BillID truyền vào BillID
     * @return trả về PikaTableModel chưa tất cả StockPurchase
     */
    public PikaTableModel searchStockPurchase(Connection conn, String BillID){
        try {
            // Chuỗi chứa lệnh select staff copy từ SQL,
            // ở cuối có thêm "where" sau đó ta sẽ cộng chuỗi để hoàn thành lệnh select
            // Copy và Sửa cái này(copy lệnh select từ SQL vd select Patient)
            String select = "select [Stock Purchase's ID],[Bill's ID],[Stock's ID],[Stock's Name], [Number], [Amount], [Date Purchase] from displayStockPurchaseTable where ";

            Statement sttm = conn.createStatement();

            select += "[Bill's ID] = " + "'" +  BillID + "'";

            // Lấy ra ResultSet
            ResultSet rs = sttm.executeQuery(select);

            PikaTableModel model = new PikaTableModel();


            // Lấy tất cả title của view đổ vào table
            ResultSetMetaData meta = rs.getMetaData();

            for (int i = 1; i <= meta.getColumnCount(); i++) {
                model.addColumn(meta.getColumnName(i));
            }

            while (rs.next()) {
                //Tạo mới vector = row

                Vector v = new Vector();

                // Add dữ liệu lần lượt vào các trường tương ứng
                // vào SQL chạy select và xem số cột của bảng
                // View displayStaffTable có 11 cột
                // Nhớ copy và sửa cái này
                for (int i = 1; i <= 7; i++) {
                    if (i == 6) {
                        v.addElement(rs.getDouble(i));
                    }else{
                        v.addElement(rs.getString(i));
                    }
                }

                // Add row vào model
                model.addRow(v);

            }

            // Ngắt các kết nối tới database
            rs.close();
            sttm.close();

            return model;

        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            // Không được xóa cái này
            return null;
        }
    }

    /**
     * Method có nhiệm vụ trả về DefaultComboBoxModel chứa tất cả Department
     * @param conn truyền vào Connection
     * @return Trả về DefaultComboBoxModel chứa tất cả department
     */
    public DefaultComboBoxModel getListDepartment(Connection conn){
        try {
            // Tạo mới comboboxModel
            // Copy ko sửa
            DefaultComboBoxModel combo = new DefaultComboBoxModel();

            // Tạo mới Statement
            // Copy ko sửa
            Statement stmt = conn.createStatement();

            // Mở file SQL lên copy lệnh select từ view(có sẵn)
            // Đây là lệnh select từ view displayDepartmentTable
            // Copy và sửa lại lệnh select
            ResultSet rs = stmt.executeQuery("select [Department's ID],[Department's Name] from displayDepartmentTable");

            // Add dữ liệu vào list
            // Copy ko cần sửa rs.getRow()
            while(rs.next()){
                combo.addElement(rs.getString(2));
            }

            // Ngắt các kết nối tới database
            
            rs.close();
            stmt.close();

            return combo;

        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }    
    }

    /**
     * Method có nhiệm vụ trả về DefaultComboBoxModel chứa tất cả TechSkill
     * @param conn truyền vào Connection
     * @return Trả về DefaultComboBoxModel chứa tất cả TechSkill
     */
    public DefaultComboBoxModel getListTechSkill(Connection conn){
        try {
            // Tạo mới comboboxModel
            DefaultComboBoxModel combo = new DefaultComboBoxModel();

            // Tạo mới Statement
            Statement stmt = conn.createStatement();

            // Đây là lệnh select từ view displayTechSkillTable
            ResultSet rs = stmt.executeQuery("select [Tech Skill's ID],[Tech Skill's Name] from displayTechSkillTable");

            // Add dữ liệu vào list
            while(rs.next()){
                combo.addElement(rs.getString(2));
            }

            // Ngắt các kết nối tới database

            rs.close();
            stmt.close();

            return combo;

        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }

    /**
     * Method có nhiệm vụ trả về DefaultComboBoxModel chứa tất cả Test
     * @param conn truyền vào Connection
     * @return Trả về DefaultComboBoxModel chứa tất cả TechSkill
     */
    public DefaultComboBoxModel getListTest(Connection conn){
        try {
            // Tạo mới comboboxModel
            DefaultComboBoxModel combo = new DefaultComboBoxModel();

            // Tạo mới Statement
            Statement stmt = conn.createStatement();

            // Đây là lệnh select từ view displayTechSkillTable
            ResultSet rs = stmt.executeQuery("select [Test's ID],[Test's Name] from displayTestTable");

            // Add dữ liệu vào list
            while(rs.next()){
                combo.addElement(rs.getString(2));
            }

            // Ngắt các kết nối tới database

            rs.close();
            stmt.close();

            return combo;

        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }

    /**
     * Method có nhiệm vụ trả về DefaultComboBoxModel chứa tất cả Test
     * @param conn truyền vào Connection
     * @return Trả về DefaultComboBoxModel chứa tất cả TechSkill
     */
    public DefaultComboBoxModel getListStock(Connection conn){
        try {
            // Tạo mới comboboxModel
            DefaultComboBoxModel combo = new DefaultComboBoxModel();

            // Tạo mới Statement
            Statement stmt = conn.createStatement();

            // Đây là lệnh select từ view displayTechSkillTable
            ResultSet rs = stmt.executeQuery("select [Stock's ID],[Stock's Name],[Cost],[Items Available],[Items Consumed] from displayStockTable");

            // Add dữ liệu vào list
            while(rs.next()){
                combo.addElement(rs.getString(2));
            }

            // Ngắt các kết nối tới database

            rs.close();
            stmt.close();

            return combo;

        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }

    /**
     * Method có nhiệm vụ trả về DefaultComboBoxModel chứa tất cả Specialization
     * @param conn truyền vào Connection
     * @return Trả về DefaultComboBoxModel chứa tất cả Specialization
     */
    public DefaultComboBoxModel getListSpecialization(Connection conn){
        try {
            // Tạo mới comboboxModel
            DefaultComboBoxModel combo = new DefaultComboBoxModel();

            // Tạo mới Statement
            Statement stmt = conn.createStatement();

           //Đây là lệnh select từ view displaySpecializationTable
            ResultSet rs = stmt.executeQuery("select [Specialization's ID], [Specialization's Name] from displaySpecializationTable");

            // Add dữ liệu vào list
            while(rs.next()){
                combo.addElement(rs.getString(2));
            }

            // Ngắt các kết nối tới database

            rs.close();
            stmt.close();

            return combo;

        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }

    /**
     * Method có nhiệm vụ thêm Staff
     * @param conn truyền vào Connection đến SQL
     * @param st truyền vào Object Staff chứa tất cả thông tin của Staff
     * @return trả về boolean true nếu thêm thành công, false nếu thất bại
     */
    public boolean addStaff(Connection conn, Staff st){
        try {
            // Chuỗi insert có số dấu hỏi tùy thuộc vào số thông tin cần Add vào Staff
            // Xem trên SQL, bảng Staff có 13 thông tin nên có 13 dấu hỏi cần thêm vào
            PreparedStatement psttm = conn.prepareCall("insert into Staff values (?,?,?,?,?,?,?,?,?,?,?,?,?,?)");

            // Thay dấu ? bằng các thông tin trong Staff
            // Thứ tự theo trong bẳng Staff của SQL
            psttm.setString(1, st.getStaffID());
            psttm.setString(2, st.getFirstName());
            psttm.setString(3, st.getLastName());
            psttm.setString(4, st.getUsername());
            psttm.setString(5, st.getPassword());
            psttm.setString(6, st.getDepartmentID());
            psttm.setDate(7, new Date(System.currentTimeMillis()));
            psttm.setString(8, st.getAddress());
            psttm.setString(9, st.getPhoneNo());

            // add Gender vào, vi Gender kiểu boolean nên phải set như sau
            // trong SQL là kiểu bit(1 hoặc 0) ứng với true hoặc flase
            if (st.isGender()) {
                psttm.setInt(10, 1);
            }else{
                psttm.setInt(10, 0);
            }

            // DateOfBirth trả về kiểu PikaDate nên ta phải chỉnh về kiểu string
            PikaDate piDate = st.getDateOfBirth();
            psttm.setString(11, piDate.getMonth() + "/" + piDate.getDate() + "/" + piDate.getYear());
            //Chúng ta sẽ có một chuỗi truyền vào dạng: "02/20/1989"

            psttm.setString(12, st.getEdu_qual());
            psttm.setString(13, st.getTechSkillID());
            psttm.setString(14, st.getSpecialID());

            //Gọi lệnh executeUpdate để thực hiện lệnh insert trong SQL
            psttm.executeUpdate();

            psttm.close();

            return true;
        } catch (SQLException ex) {            
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }
    }

    /**
     * Method có nhiệm vụ thêm Patient
     * @param conn truyền vào Connection đến SQL
     * @param st truyền vào Object Staff chứa tất cả thông tin của Patient
     * @return trả về boolean true nếu thêm thành công, false nếu thất bại
     */
    public boolean addPatient(Connection conn, Patient pa){
        try {
            // Chuỗi insert có số dấu hỏi tùy thuộc vào số thông tin cần Add vào Patient
            // Xem trên SQL, bảng Patient có 7 thông tin nên có 7 dấu hỏi cần thêm vào
            PreparedStatement psttm = conn.prepareCall("insert into Patient values (?,?,?,?,?,?)");

            // Thay dấu ? bằng các thông tin trong Patient
            // Thứ tự theo trong bẳng Patient của SQL
            psttm.setString(1, pa.getFirstName());
            psttm.setString(2, pa.getLastName());
            psttm.setString(3, pa.getAddress());
            psttm.setString(4, pa.getPhoneNo());

            // add Gender vào, vi Gender kiểu boolean nên phải set như sau
            // trong SQL là kiểu bit(1 hoặc 0) ứng với true hoặc flase
            if (pa.isGender()) {
                psttm.setInt(5, 1);
            }else{
                psttm.setInt(5, 0);
            }

            // DateOfBirth trả về kiểu PikaDate nên ta phải chỉnh về kiểu string
            PikaDate piDate = pa.getDateOfBirth();
            psttm.setString(6, piDate.getMonth() + "/" + piDate.getDate() + "/" + piDate.getYear());
            //Chúng ta sẽ có một chuỗi truyền vào dạng: "02/20/1989"


            //Gọi lệnh executeUpdate để thực hiện lệnh insert trong SQL
            psttm.executeUpdate();

            psttm.close();

            return true;
        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }
    }

    /**
     * Method có nhiệm vụ thêm Report
     * @param conn truyên vào Connection
     * @param rp truyền vào Object Report chứa tất cả thông tin của Report
     * @return trả về true nếu thêm thành công, false nếu thất bại
     */
   public boolean addReport(Connection conn, Report rp){
        try {
            // Chuỗi insert có số dấu hỏi tùy thuộc vào số thông tin cần Add vào Report
            PreparedStatement psttm = conn.prepareCall("insert into Report values (?,?,?,?,?,?)");

            // Thứ tự theo trong bẳng report của SQL
            psttm.setInt(1, rp.getTestPurchaseID());
            psttm.setString(2, rp.getPatientID());
            psttm.setString(3, rp.getStaffID());

            psttm.setDate(4, new Date(System.currentTimeMillis()));

            psttm.setString(5, rp.getPatientReport());
            psttm.setString(6, rp.getDoctorReport());

            //Gọi lệnh executeUpdate để thực hiện lệnh insert trong SQL
            psttm.executeUpdate();

            psttm.close();

            return true;
        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }
    }

   /**
    * Method có nhiệm vụ thêm Test
    * @param conn truyền vào Connection
    * @param ts truyền vào Object Test chứa tất cả thông tin của Test
    * @return trả về truye nếu thêm thành công, false nếu thất bại
    */
     public boolean addTest(Connection conn, Test ts){
        try {
            // Chuỗi insert có số dấu hỏi tùy thuộc vào số thông tin cần Add vào Report
            PreparedStatement psttm = conn.prepareCall("insert into Test values (?,?,?)");

            // Thứ tự theo trong bẳng report của SQL
            psttm.setString(1, ts.getTestID());
            psttm.setString(2, ts.getTestName());
            psttm.setDouble(3, ts.getCost());
            
            //Gọi lệnh executeUpdate để thực hiện lệnh insert trong SQL
            psttm.executeUpdate();

            psttm.close();

            return true;
        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }
    }

     /**
     * Method có nhiệm vụ thêm TestPurchase
     * @param conn truyền vào Connection đến SQL
     * @param st truyền vào Object TestPurchase chứa tất cả thông tin của TestPurchase
     * @return trả về boolean true nếu thêm thành công, false nếu thất bại
     */
    public boolean addTestPurchase(Connection conn, TestPurchase tp){
        try {
            // Chuỗi insert có số dấu hỏi tùy thuộc vào số thông tin cần Add vào TestPurchase
            // Xem trên SQL, bảng TestPurchase có 4 thông tin nên có 4 dấu hỏi cần thêm vào
            PreparedStatement psttm = conn.prepareCall("insert into TestPurchase values (?,?,?)");

            // Thay dấu ? bằng các thông tin trong TestPurchase
            // Thứ tự theo trong bẳng TestPurchase của SQL
            psttm.setInt(1, tp.getBillID());
            psttm.setString(2, tp.getTestID());

            PikaDate piDate = tp.getDatePurchase();
            psttm.setDate(3, new Date(System.currentTimeMillis()));

            //Gọi lệnh executeUpdate để thực hiện lệnh insert trong SQL
            psttm.executeUpdate();

            psttm.close();

            return true;
        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }
    }

     /**
     * Method có nhiệm vụ thêm Stock
     * @param conn truyền vào Connection đến SQL
     * @param st truyền vào Object Stock chứa tất cả thông tin của Stock
     * @return trả về boolean true nếu thêm thành công, false nếu thất bại
     */
    public boolean addStock(Connection conn, Stock st){
        try {
            // Chuỗi insert có số dấu hỏi tùy thuộc vào số thông tin cần Add vào Stock
            // Xem trên SQL, bảng Stock có 5 thông tin nên có 5 dấu hỏi cần thêm vào
            PreparedStatement psttm = conn.prepareCall("insert into Stock values (?,?,?,?,?)");

            // Thay dấu ? bằng các thông tin trong Stock
            // Thứ tự theo trong bẳng Stock của SQL
            psttm.setString(1, st.getStockID());
            psttm.setString(2, st.getStockName());
            psttm.setDouble(3, st.getCost());
            psttm.setInt(4, st.getInum());
            psttm.setInt(5, st.getDnum());
                      
            //Gọi lệnh executeUpdate để thực hiện lệnh insert trong SQL
            psttm.executeUpdate();

            psttm.close();

            return true;
        } catch (SQLException ex) {            
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }
    }

    /**
     * Method có nhiệm vụ thêm StockPurchase
     * @param conn truyền vào Connection đến SQL
     * @param st truyền vào Object StockPurchase chứa tất cả thông tin của StockPurchase
     * @return trả về boolean true nếu thêm thành công, false nếu thất bại
     */
    public boolean addStockPurchase(Connection conn, StockPurchase sp){
        try {
            // Chuỗi insert có số dấu hỏi tùy thuộc vào số thông tin cần Add vào StockPurchase
            // Xem trên SQL, bảng StockPurchase có 5 thông tin nên có 5 dấu hỏi cần thêm vào
            PreparedStatement psttm = conn.prepareCall("insert into StockPurchase values (?,?,?,?)");

            // Thay dấu ? bằng các thông tin trong Stock
            // Thứ tự theo trong bẳng StockPurchase của SQL
            psttm.setInt(1, sp.getBillID());
            psttm.setString(2, sp.getStockID());
            psttm.setInt(3, sp.getNum());
            
            psttm.setDate(4, new Date(System.currentTimeMillis()));

            //Gọi lệnh executeUpdate để thực hiện lệnh insert trong SQL
            psttm.executeUpdate();

            psttm.close();

            return true;
        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }
    }

    /**
     * Method có nhiệm vụ thêm TechSkill
     * @param conn truyền vào Connection đến SQL
     * @param tk truyền vào Object TechSkill chứa tất cả thông tin của TechSkill
     * @return trả về boolean true nếu thêm thành công, false nếu thất bại
     */
    public boolean addTechSkill(Connection conn, TechSkill tk){
        try {
            // Chuỗi insert có số dấu hỏi tùy thuộc vào số thông tin cần Add vào TechSkill
            // Xem trên SQL, bảng TechSkill có 2 thông tin nên có 2 dấu hỏi cần thêm vào
            PreparedStatement psttm = conn.prepareCall("insert into TechSkill values (?,?)");

            // Thay dấu ? bằng các thông tin trong TechSkill
            // Thứ tự theo trong bẳng TechSkill của SQL
            psttm.setString(1, tk.getTechSkillID());
            psttm.setString(2, tk.getTechSkillName());

            //Gọi lệnh executeUpdate để thực hiện lệnh insert trong SQL
            psttm.executeUpdate();

            psttm.close();

            return true;
        } catch (SQLException ex) {            
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }
    }

    /**
     * Method có nhiệm vụ thêm Bill
     * @param conn truyền vào Connection đến SQL
     * @param st truyền vào Object Bill chứa tất cả thông tin của Bill
     * @return trả về boolean true nếu thêm thành công, false nếu thất bại
     */
    public boolean addBill(Connection conn, Bill bi){
        try {
            // Chuỗi insert có số dấu hỏi tùy thuộc vào số thông tin cần Add vào Bill
            // Xem trên SQL, bảng Stock có 7 thông tin nên có  dấu hỏi cần thêm vào
            PreparedStatement psttm = conn.prepareCall("insert into Bill values (?,?,?,?,?,?)");

            // Thay dấu ? bằng các thông tin trong Bill
            // Thứ tự theo trong bẳng Bill của SQL
            psttm.setInt(1, bi.getPatientID());

            if (bi.isPaid()) {
                psttm.setString(2, bi.getCollectorID());
            }else{
                psttm.setNull(2, java.sql.Types.VARCHAR);
            }
            
            psttm.setDouble(3, bi.getAmount());

            psttm.setDate(4, new Date(System.currentTimeMillis()));

            if (bi.isPaid()) {
                psttm.setDate(5, new Date(System.currentTimeMillis()));
            }else{
                psttm.setNull(5, java.sql.Types.DATE);
            }
            
            psttm.setBoolean(6, bi.isPaid());

            //Gọi lệnh executeUpdate để thực hiện lệnh insert trong SQL
            psttm.executeUpdate();

            psttm.close();

            return true;
        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }
    }

    /**
     * Method có nhiệm vụ thêm Specialization
     * @param conn truyền vào Connection đến SQL
     * @param st truyền vào Object Specialization chứa tất cả thông tin của Specialization
     * @return trả về boolean true nếu thêm thành công, false nếu thất bại
     */
    public boolean addSpecialization(Connection conn, Specialization sp){
        try {
            // Chuỗi insert có số dấu hỏi tùy thuộc vào số thông tin cần Add vào Specialization
            // Xem trên SQL, bảng Specialization có 2 thông tin nên có 2 dấu hỏi cần thêm vào
            PreparedStatement psttm = conn.prepareCall("insert into Specialization values (?,?)");

            // Thay dấu ? bằng các thông tin trong Specialization
            // Thứ tự theo trong bẳng Specialization của SQL
            psttm.setString(1, sp.getSpecialID());
            psttm.setString(2, sp.getSpeciallName());

            //Gọi lệnh executeUpdate để thực hiện lệnh insert trong SQL
            psttm.executeUpdate();

            psttm.close();

            return true;
        } catch (SQLException ex) {            
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }
    }

    /**
     * Method này sẽ trả về một object Staff chứa thông tin của bảng staff
     * @param conn(chuyền vào một Connection)
     * @return trả vè một object Staff
     */
    public Staff generateStaff(Connection conn, String StaffID) {
        try {
            Staff sta = new Staff();

            /**
             * Tạo mới statement từ connection
             */
            Statement stmt = conn.createStatement();

            String select = "select StaffID, F_name, L_name, Username, Password, DepartmentID, Address, PhoneNo, Gender, Convert(varchar(10),DateOfBirth,101), Edu_qual, TechSkillID, SpecialID from Staff where StaffID = ";

            select += "'" + StaffID + "'";

            // Câu lệnh truy vấn đến các trường trong bảng Staff
            ResultSet rs = stmt.executeQuery(select);
            rs.next();

            sta.setStaffID(rs.getString("StaffID"));
            sta.setFirstName(rs.getString("F_name"));
            sta.setLastName(rs.getString("L_name"));
            sta.setUsername(rs.getString("Username"));
            sta.setPassword(rs.getString("Password"));
            sta.setDepartmentID(rs.getString("DepartmentID"));
            sta.setAddress(rs.getString("Address"));
            sta.setPhoneNo(rs.getString("PhoneNo"));

            if (rs.getString("Gender").equalsIgnoreCase("1")) {
                sta.setGender(true);
            } else {
                sta.setGender(false);
            }

            String date[] = rs.getString(10).split("/");
            
            PikaDate pika = new PikaDate();
            
            pika.setMonth(Integer.parseInt(date[0]));
            pika.setDate(Integer.parseInt(date[1]));
            pika.setYear(Integer.parseInt(date[2]));

            sta.setDateOfBirth(pika);

            sta.setEdu_qual(rs.getString("Edu_qual"));
            sta.setTechSkillID(rs.getString("TechSkillID"));
            sta.setSpecialID(rs.getString("SpecialID"));

            // Ngắt các kết nối tới database
            rs.close();
            stmt.close();

            return sta;

        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }

    /**
     * Method này sẽ trả về một object Patient chứa thông tin của bảng Patient
     * @param conn(chuyền vào một Connection)
     * @return trả vè một object Patient
     */
    public Patient generatePatient(Connection conn, int PatientID) {
        try {
            Patient pt = new Patient();

            /**
             * Tạo mới statement từ connection
             */
            Statement stmt = conn.createStatement();

            String select = "select PatientID, F_name, L_name, Address, PhoneNo, Gender, Convert(varchar(10),DateOfBirth,101) from Patient where PatientID = ";

            select += PatientID;

            // Câu lệnh truy vấn đến các trường trong bảng Staff
            ResultSet rs = stmt.executeQuery(select);
            rs.next();

            pt.setPatientID(rs.getInt("PatientID"));
            pt.setFirstName(rs.getString("F_name"));
            pt.setLastName(rs.getString("L_name"));
            pt.setAddress(rs.getString("Address"));
            pt.setPhoneNo(rs.getString("PhoneNo"));

            if (rs.getString("Gender").equalsIgnoreCase("1")) {
                pt.setGender(true);
            } else {
                pt.setGender(false);
            }

            String date[] = rs.getString(7).split("/");

            PikaDate pika = new PikaDate();

            pika.setMonth(Integer.parseInt(date[0]));
            pika.setDate(Integer.parseInt(date[1]));
            pika.setYear(Integer.parseInt(date[2]));

            pt.setDateOfBirth(pika);

            // Ngắt các kết nối tới database
            rs.close();
            stmt.close();

            return pt;

        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }

    /**
     * Method này có nhiệm vụ xóa Staff theo StaffID truyền vào
     * @param StaffID
     * @param conn truyền vào Connection
     * @return trả về true nếu xóa thành công, false nếu thất bại
     */
    public boolean deleteStaff(Connection conn, String StaffID){
        try {
            //Chuỗi delete truyền vào StaffID
            PreparedStatement psttm = conn.prepareCall("delete Staff where StaffID = ?");

            // Thay dấu ? Bằng chuỗi StaffID truyền vào
            psttm.setString(1, StaffID);

            //Gọi lệnh executeUpdate để thực hiện lệnh delete trong SQL
            psttm.executeUpdate();

            psttm.close();

            return true;
        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }
    }

    /**
     * Method này có nhiệm vụ xóa Bill theo BillID truyền vào
     * @param BillID
     * @param conn truyền vào Connection
     * @return trả về true nếu xóa thành công, false nếu thất bại
     */
    public boolean deleteBill(Connection conn, int BillID){
        try {
            //Chuỗi delete truyền vào BillID
            PreparedStatement psttm = conn.prepareCall("delete Bill where BillID = ?");

            // Thay dấu ? Bằng chuỗi BillID truyền vào
            psttm.setInt(1, BillID);

            //Gọi lệnh executeUpdate để thực hiện lệnh delete trong SQL
            psttm.executeUpdate();

            psttm.close();

            return true;
        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }
    }

    /**
     * Method này có nhiệm vụ xóa Patient theo PatientID truyền vào
     * @param PatientID
     * @param conn truyền vào Connection
     * @return trả về true nếu xóa thành công, false nếu thất bại
     */
    public boolean deletePatient(Connection conn, int PatientID){
        try {
            //Chuỗi delete truyền vào PatientID
            PreparedStatement psttm = conn.prepareCall("delete Patient where PatientID = ?");

            // Thay dấu ? Bằng chuỗi PatientID truyền vào
            psttm.setInt(1, PatientID);

            //Gọi lệnh executeUpdate để thực hiện lệnh delete trong SQL
            psttm.executeUpdate();

            psttm.close();

            return true;
        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }
    }

    /**
     * Method này có nhiệm vụ xóa Report theo ReportID truyền vào
     * @param ReportID
     * @param conn truyền vào Connection
     * @return trả về true nếu xóa thành công, false nếu thất bại
     */
    public boolean deleteReport(Connection conn, int ReportID){
        try {
            //Chuỗi delete truyền vào ReportID
            PreparedStatement psttm = conn.prepareCall("delete Report where ReportID = ?");

            // Thay dấu ? Bằng chuỗi ReportID truyền vào
            psttm.setInt(1, ReportID);

            //Gọi lệnh executeUpdate để thực hiện lệnh delete trong SQL
            psttm.executeUpdate();

            psttm.close();

            return true;
        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }
    }
    
    /**
     * Method này có nhiệm vụ xóa Test theo TestID truyền vào
     * @param TestID
     * @param conn truyền vào Connection
     * @return trả về true nếu xóa thành công, false nếu thất bại
     */
    public boolean deleteTest(Connection conn, String TestID){
        try {
            //Chuỗi delete truyền vào TestID
            PreparedStatement psttm = conn.prepareCall("delete Test where TestID = ?");

            // Thay dấu ? Bằng chuỗi TestID truyền vào
            psttm.setString(1, TestID);

            //Gọi lệnh executeUpdate để thực hiện lệnh delete trong SQL
            psttm.executeUpdate();

            psttm.close();

            return true;
        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }
    }

    /**
     * Method này có nhiệm vụ xóa Stock theo StockID truyền vào
     * @param StockID
     * @param conn truyền vào Connection
     * @return trả về true nếu xóa thành công, false nếu thất bại
     */
    public boolean deleteStock(Connection conn, String StockID){
        try {
            //Chuỗi delete truyền vào StockID
            PreparedStatement psttm = conn.prepareCall("delete Stock where StockID = ?");

            // Thay dấu ? Bằng chuỗi StockID truyền vào
            psttm.setString(1, StockID);

            //Gọi lệnh executeUpdate để thực hiện lệnh delete trong SQL
            psttm.executeUpdate();

            psttm.close();

            return true;
        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }
    }

    /**
     * Method này có nhiệm vụ xóa Tech Skill theo TechSkillID truyền vào
     * @param TéchkillID
     * @param conn truyền vào Connection
     * @return trả về true nếu xóa thành công, false nếu thất bại
     */
    public boolean deleteTechSkill(Connection conn, String TechSkillID){
        try {
            //Chuỗi delete truyền vào TechSkillID
            PreparedStatement psttm = conn.prepareCall("delete TechSkill where TechSkillID = ?");

            // Thay dấu ? Bằng chuỗi TechSkillID truyền vào
            psttm.setString(1, TechSkillID);

            //Gọi lệnh executeUpdate để thực hiện lệnh delete trong SQL
            psttm.executeUpdate();

            psttm.close();

            return true;
        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }
    }

    /**
     * Method này có nhiệm vụ xóa Specialization theo SpecializationID truyền vào
     * @param SpecializationID
     * @param conn truyền vào Connection
     * @return trả về true nếu xóa thành công, false nếu thất bại
     */
    public boolean deleteSpecialization(Connection conn, String SpecialID){
        try {
            //Chuỗi delete truyền vào SpecializationID
            PreparedStatement psttm = conn.prepareCall("delete Specialization where SpecialID = ?");

            // Thay dấu ? Bằng chuỗi SpecializationID truyền vào
            psttm.setString(1, SpecialID);

            //Gọi lệnh executeUpdate để thực hiện lệnh delete trong SQL
            psttm.executeUpdate();

            psttm.close();

            return true;
        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }
    }

    /**
     * Method này có nhiệm vụ xóa TestPurchase theo TestPurchaseID truyền vào
     * @param TestPurchaseID
     * @param conn truyền vào Connection
     * @return trả về true nếu xóa thành công, false nếu thất bại
     */
    public boolean deleteTestPurchase(Connection conn, String TestPurchaseID){
        try {
            //Chuỗi delete truyền vào TestPurchaseID
            PreparedStatement psttm = conn.prepareCall("delete TestPurchase where TestPurchaseID = ?");

            // Thay dấu ? Bằng chuỗi TestPurchaseID truyền vào
            psttm.setString(1, TestPurchaseID);

            //Gọi lệnh executeUpdate để thực hiện lệnh delete trong SQL
            psttm.executeUpdate();

            psttm.close();

            return true;
        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }
    }
    
    /**
     * Method này có nhiệm vụ xóa StockPurchase theo StockPurchaseID truyền vào
     * @param StockPurchaseID
     * @param conn truyền vào Connection
     * @return trả về true nếu xóa thành công, false nếu thất bại
     */
    public boolean deleteStockPurchase(Connection conn, String StockPurchaseID){
        try {
            //Chuỗi delete truyền vào StockPurchaseID
            PreparedStatement psttm = conn.prepareCall("delete StockPurchase where StockPurchaseID = ?");

            // Thay dấu ? Bằng chuỗi StockPurchaseID truyền vào
            psttm.setString(1, StockPurchaseID);

            //Gọi lệnh executeUpdate để thực hiện lệnh delete trong SQL
            psttm.executeUpdate();

            psttm.close();

            return true;
        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }
    }

    /**
     * Method có nhiệm vụ sửa Specialization
     * @param conn truyền vào Connection đến SQL
     * @param specID truyền vào ID của spec cần sửa
     * @param st truyền vào Object Specialization chứa tất cả thông tin của Specialization
     * @return trả về boolean true nếu thêm thành công, false nếu thất bại
     */
    public boolean editSpecialization(Connection conn, String specID, Specialization sp){
        try {
            // Chuỗi insert có số dấu hỏi tùy thuộc vào số thông tin cần Add vào Specialization
            // Xem trên SQL, bảng Specialization có 2 thông tin nên có 2 dấu hỏi cần thêm vào
            PreparedStatement psttm = conn.prepareCall("update Specialization set SpecialID = ?, SpecialName = ? where SpecialID = ?");

            // Thay dấu ? bằng các thông tin trong Specialization
            // Thứ tự theo trong bẳng Specialization của SQL
            psttm.setString(1, sp.getSpecialID());
            psttm.setString(2, sp.getSpeciallName());
            psttm.setString(3, specID);

            //Gọi lệnh executeUpdate để thực hiện lệnh insert trong SQL
            psttm.executeUpdate();

            psttm.close();

            return true;
        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }
    }

    /**
     * Method có nhiệm vụ sửa TechSkill
     * @param conn truyền vào Connection đến SQL
     * @param techID truyền vào ID của TechSkill cần sửa
     * @param ts truyền vào Object TechSkill chứa tất cả thông tin của TechSkill
     * @return trả về boolean true nếu thêm thành công, false nếu thất bại
     */
    public boolean editTechSkill(Connection conn, String techID, TechSkill ts){
        try {
            // Chuỗi insert có số dấu hỏi tùy thuộc vào số thông tin cần Add vào Specialization
            // Xem trên SQL, bảng Specialization có 2 thông tin nên có 2 dấu hỏi cần thêm vào
            PreparedStatement psttm = conn.prepareCall("update TechSkill set TechSkillID = ?, TechSkillName = ? where TechSkillID = ?");

            // Thay dấu ? bằng các thông tin trong Specialization
            // Thứ tự theo trong bẳng Specialization của SQL
            psttm.setString(1, ts.getTechSkillID());
            psttm.setString(2, ts.getTechSkillName());
            psttm.setString(3, techID);

            //Gọi lệnh executeUpdate để thực hiện lệnh insert trong SQL
            psttm.executeUpdate();

            psttm.close();

            return true;
        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }
    }

    /**
     * Method có nhiệm vụ sửa Test
     * @param conn truyền vào Connection đến SQL
     * @param testID truyền vào ID của Test cần sửa
     * @param ts truyền vào Object Test chứa tất cả thông tin của Test
     * @return trả về boolean true nếu thêm thành công, false nếu thất bại
     */
    public boolean editTest(Connection conn, String testID, Test ts){
        try {
            // Chuỗi insert có số dấu hỏi tùy thuộc vào số thông tin cần Add vào Specialization
            // Xem trên SQL, bảng Specialization có 2 thông tin nên có 2 dấu hỏi cần thêm vào
            PreparedStatement psttm = conn.prepareCall("update Test set TestID = ?, TestName = ?, Cost = ? where TestID = ?");

            // Thay dấu ? bằng các thông tin trong Specialization
            // Thứ tự theo trong bẳng Specialization của SQL
            psttm.setString(1, ts.getTestID());
            psttm.setString(2, ts.getTestName());
            psttm.setDouble(3, ts.getCost());
            psttm.setString(4, testID);

            //Gọi lệnh executeUpdate để thực hiện lệnh insert trong SQL
            psttm.executeUpdate();

            psttm.close();

            return true;
        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }
    }

    /**
     * Method có nhiệm vụ thêm TestPurchase
     * @param conn truyền vào Connection đến SQL
     * @param st truyền vào Object TestPurchase chứa tất cả thông tin của TestPurchase
     * @return trả về boolean true nếu thêm thành công, false nếu thất bại
     */
    public boolean editTestPurchase(Connection conn, int testPurchaseID, String testID){
        try {
            // Chuỗi insert có số dấu hỏi tùy thuộc vào số thông tin cần Add vào TestPurchase
            // Xem trên SQL, bảng TestPurchase có 4 thông tin nên có 4 dấu hỏi cần thêm vào
            PreparedStatement psttm = conn.prepareCall("update TestPurchase set TestID = ? where TestPurchaseID = ?");

            // Thay dấu ? bằng các thông tin trong TestPurchase
            // Thứ tự theo trong bẳng TestPurchase của SQL
            psttm.setString(1, testID);
            psttm.setInt(2, testPurchaseID);

            //Gọi lệnh executeUpdate để thực hiện lệnh insert trong SQL
            psttm.executeUpdate();

            psttm.close();

            return true;
        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }
    }

    /**
     * Method có nhiệm vụ thêm TestPurchase
     * @param conn truyền vào Connection đến SQL
     * @param st truyền vào Object TestPurchase chứa tất cả thông tin của TestPurchase
     * @return trả về boolean true nếu thêm thành công, false nếu thất bại
     */
    public boolean editStockPurchase(Connection conn, int stockPurchaseID, StockPurchase tockP){
        try {
            // Chuỗi insert có số dấu hỏi tùy thuộc vào số thông tin cần Add vào TestPurchase
            // Xem trên SQL, bảng TestPurchase có 4 thông tin nên có 4 dấu hỏi cần thêm vào
            PreparedStatement psttm = conn.prepareCall("update StockPurchase set StockID = ?, num = ? where StockPurchaseID = ?");

            // Thay dấu ? bằng các thông tin trong TestPurchase
            // Thứ tự theo trong bẳng TestPurchase của SQL
            psttm.setString(1, tockP.getStockID());
            psttm.setInt(2, tockP.getNum());
            psttm.setInt(3, stockPurchaseID);

            //Gọi lệnh executeUpdate để thực hiện lệnh insert trong SQL
            psttm.executeUpdate();

            psttm.close();

            return true;
        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }
    }

    /**
     * Method có nhiệm vụ sửa Stock
     * @param conn truyền vào Connection đến SQL
     * @param stockID truyền vào ID của Stock cần sửa
     * @param ts truyền vào Object Stock chứa tất cả thông tin của Stock
     * @return trả về boolean true nếu thêm thành công, false nếu thất bại
     */
    public boolean editStock(Connection conn, String stockID, Stock ts){
        try {
            // Chuỗi insert có số dấu hỏi tùy thuộc vào số thông tin cần Add vào Specialization
            // Xem trên SQL, bảng Specialization có 2 thông tin nên có 2 dấu hỏi cần thêm vào
            PreparedStatement psttm = conn.prepareCall("update Stock set StockID = ?, StockName = ?, Cost = ?, inum = ?, dnum = ? where StockID = ?");

            // Thay dấu ? bằng các thông tin trong Specialization
            // Thứ tự theo trong bẳng Specialization của SQL
            psttm.setString(1, ts.getStockID());
            psttm.setString(2, ts.getStockName());
            psttm.setDouble(3, ts.getCost());
            psttm.setInt(4, ts.getInum());
            psttm.setInt(5, ts.getDnum());
            psttm.setString(6, stockID);

            //Gọi lệnh executeUpdate để thực hiện lệnh insert trong SQL
            psttm.executeUpdate();

            psttm.close();

            return true;
        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }
    }

    /**
     * Method có nhiệm vụ sửa Stock
     * @param conn truyền vào Connection đến SQL
     * @param stockID truyền vào ID của Stock cần sửa
     * @param ts truyền vào Object Stock chứa tất cả thông tin của Stock
     * @return trả về boolean true nếu thêm thành công, false nếu thất bại
     */
    public boolean editStockNum(Connection conn, String stockID, int inum, int dnum){
        try {
            // Chuỗi insert có số dấu hỏi tùy thuộc vào số thông tin cần Add vào Specialization
            // Xem trên SQL, bảng Specialization có 2 thông tin nên có 2 dấu hỏi cần thêm vào
            PreparedStatement psttm = conn.prepareCall("update Stock set inum = ?, dnum = ? where StockID = ?");

            // Thay dấu ? bằng các thông tin trong Specialization
            // Thứ tự theo trong bẳng Specialization của SQL
            psttm.setInt(1, inum);
            psttm.setInt(2, dnum);
            psttm.setString(3, stockID);

            //Gọi lệnh executeUpdate để thực hiện lệnh insert trong SQL
            psttm.executeUpdate();

            psttm.close();

            return true;
        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }
    }

    /**
     * Method có nhiệm vụ sửa Staff
     * @param conn truyền vào Connection đến SQL
     * @param staffID truyền vào ID của Staff cần sửa
     * @param ts truyền vào Object Staff chứa tất cả thông tin của Staff
     * @return trả về boolean true nếu thêm thành công, false nếu thất bại
     */
    public boolean editStaff(Connection conn, String staffID, Staff ts){
        try {
            // Chuỗi insert có số dấu hỏi tùy thuộc vào số thông tin cần Add vào Specialization
            // Xem trên SQL, bảng Specialization có 2 thông tin nên có 2 dấu hỏi cần thêm vào
            PreparedStatement psttm = conn.prepareCall("update Staff set StaffID = ?, F_name = ?, L_name = ?, Username = ?, Password = ?, DepartmentID = ?, Address = ?, PhoneNo = ?, Gender = ?, DateOfBirth = ?, Edu_qual = ?, TechSkillID = ?, SpecialID = ? where StaffID = ?");

            // Thay dấu ? bằng các thông tin trong Specialization
            // Thứ tự theo trong bẳng Specialization của SQL
            psttm.setString(1, ts.getStaffID());
            psttm.setString(2, ts.getFirstName());
            psttm.setString(3, ts.getLastName());
            psttm.setString(4, ts.getUsername());
            psttm.setString(5, ts.getPassword());
            psttm.setString(6, ts.getDepartmentID());
            psttm.setString(7, ts.getAddress());
            psttm.setString(8, ts.getPhoneNo());
            
            // add Gender vào, vi Gender kiểu boolean nên phải set như sau
            // trong SQL là kiểu bit(1 hoặc 0) ứng với true hoặc flase
            if (ts.isGender()) {
                psttm.setInt(9, 1);
            }else{
                psttm.setInt(9, 0);
            }

            // DateOfBirth trả về kiểu PikaDate nên ta phải chỉnh về kiểu string
            PikaDate piDate = ts.getDateOfBirth();
            psttm.setString(10, piDate.getMonth() + "/" + piDate.getDate() + "/" + piDate.getYear());
            //Chúng ta sẽ có một chuỗi truyền vào dạng: "02/20/1989"

            psttm.setString(11, ts.getEdu_qual());
            psttm.setString(12, ts.getTechSkillID());
            psttm.setString(13, ts.getSpecialID());

            psttm.setString(14, staffID);

            //Gọi lệnh executeUpdate để thực hiện lệnh insert trong SQL
            psttm.executeUpdate();

            psttm.close();

            return true;
        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }
    }

    /**
     * Method có nhiệm vụ sửa Staff
     * @param conn truyền vào Connection đến SQL
     * @param staffID truyền vào ID của Staff cần sửa
     * @param ts truyền vào Object Staff chứa tất cả thông tin của Staff
     * @return trả về boolean true nếu thêm thành công, false nếu thất bại
     */
    public boolean editStaffNoPass(Connection conn, String staffID, Staff ts){
        try {
            // Chuỗi insert có số dấu hỏi tùy thuộc vào số thông tin cần Add vào Specialization
            // Xem trên SQL, bảng Specialization có 2 thông tin nên có 2 dấu hỏi cần thêm vào
            PreparedStatement psttm = conn.prepareCall("update Staff set StaffID = ?, F_name = ?, L_name = ?, Username = ?, DepartmentID = ?, Address = ?, PhoneNo = ?, Gender = ?, DateOfBirth = ?, Edu_qual = ?, TechSkillID = ?, SpecialID = ? where StaffID = ?");

            // Thay dấu ? bằng các thông tin trong Specialization
            // Thứ tự theo trong bẳng Specialization của SQL
            psttm.setString(1, ts.getStaffID());
            psttm.setString(2, ts.getFirstName());
            psttm.setString(3, ts.getLastName());
            psttm.setString(4, ts.getUsername());
            psttm.setString(5, ts.getDepartmentID());
            psttm.setString(6, ts.getAddress());
            psttm.setString(7, ts.getPhoneNo());

            // add Gender vào, vi Gender kiểu boolean nên phải set như sau
            // trong SQL là kiểu bit(1 hoặc 0) ứng với true hoặc flase
            if (ts.isGender()) {
                psttm.setInt(8, 1);
            }else{
                psttm.setInt(8, 0);
            }

            // DateOfBirth trả về kiểu PikaDate nên ta phải chỉnh về kiểu string
            PikaDate piDate = ts.getDateOfBirth();
            psttm.setString(9, piDate.getMonth() + "/" + piDate.getDate() + "/" + piDate.getYear());
            //Chúng ta sẽ có một chuỗi truyền vào dạng: "02/20/1989"

            psttm.setString(10, ts.getEdu_qual());
            psttm.setString(11, ts.getTechSkillID());
            psttm.setString(12, ts.getSpecialID());

            psttm.setString(13, staffID);

            //Gọi lệnh executeUpdate để thực hiện lệnh insert trong SQL
            psttm.executeUpdate();

            psttm.close();

            return true;
        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }
    }

    /**
     * Method có nhiệm vụ sửa Patient
     * @param conn truyền vào Connection đến SQL
     * @param patientID truyền vào ID của Patient cần sửa
     * @param ts truyền vào Object Patient chứa tất cả thông tin của Patient
     * @return trả về boolean true nếu thêm thành công, false nếu thất bại
     */
    public boolean editPatient(Connection conn, int patientID, Patient ts){
        try {
            // Chuỗi insert có số dấu hỏi tùy thuộc vào số thông tin cần Add vào Specialization
            // Xem trên SQL, bảng Specialization có 2 thông tin nên có 2 dấu hỏi cần thêm vào
            PreparedStatement psttm = conn.prepareCall("update Patient set F_name = ?, L_name = ?, Address = ?, PhoneNo = ?, Gender = ?, DateOfBirth = ? where PatientID = ?");

            // Thay dấu ? bằng các thông tin trong Specialization
            // Thứ tự theo trong bẳng Specialization của SQL
            psttm.setString(1, ts.getFirstName());
            psttm.setString(2, ts.getLastName());
            psttm.setString(3, ts.getAddress());
            psttm.setString(4, ts.getPhoneNo());

            // add Gender vào, vi Gender kiểu boolean nên phải set như sau
            // trong SQL là kiểu bit(1 hoặc 0) ứng với true hoặc flase
            if (ts.isGender()) {
                psttm.setInt(5, 1);
            }else{
                psttm.setInt(5, 0);
            }

            // DateOfBirth trả về kiểu PikaDate nên ta phải chỉnh về kiểu string
            PikaDate piDate = ts.getDateOfBirth();
            psttm.setString(6, piDate.getMonth() + "/" + piDate.getDate() + "/" + piDate.getYear());
            //Chúng ta sẽ có một chuỗi truyền vào dạng: "02/20/1989"

            psttm.setInt(7, patientID);

            //Gọi lệnh executeUpdate để thực hiện lệnh insert trong SQL
            psttm.executeUpdate();

            psttm.close();

            return true;
        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }
    }

    /**
     * Method có nhiệm vụ sửa Report
     * @param conn truyền vào Connection đến SQL
     * @param reportID truyền vào ID của Report cần sửa
     * @param ts truyền vào Object Report chứa tất cả thông tin của Report
     * @return trả về boolean true nếu thêm thành công, false nếu thất bại
     */
    public boolean editReport(Connection conn, int reportID, Report ts){
        try {
            // Chuỗi insert có số dấu hỏi tùy thuộc vào số thông tin cần Add vào Specialization
            // Xem trên SQL, bảng Specialization có 2 thông tin nên có 2 dấu hỏi cần thêm vào
            PreparedStatement psttm = conn.prepareCall("update Report set PatientReport = ?, DoctorReport = ?, TestPurchaseID = ? where ReportID = ?");

            // Thay dấu ? bằng các thông tin trong Specialization
            // Thứ tự theo trong bẳng Specialization của SQL
            psttm.setString(1, ts.getPatientReport());
            psttm.setString(2, ts.getDoctorReport());
            psttm.setInt(3, ts.getTestPurchaseID());

            psttm.setInt(4, reportID);

            //Gọi lệnh executeUpdate để thực hiện lệnh insert trong SQL
            psttm.executeUpdate();

            psttm.close();

            return true;
        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }
    }

    /**
     * Method có nhiệm vụ sửa Bill
     * @param conn truyền vào Connection đến SQL
     * @param billID truyền vào ID của Bill cần sửa
     * @param ts truyền vào Object Bill chứa tất cả thông tin của Bill
     * @return trả về boolean true nếu thêm thành công, false nếu thất bại
     */
    public boolean editBill(Connection conn, int billID, Bill ts){
        try {
            // Chuỗi insert có số dấu hỏi tùy thuộc vào số thông tin cần Add vào Specialization
            // Xem trên SQL, bảng Specialization có 2 thông tin nên có 2 dấu hỏi cần thêm vào
            PreparedStatement psttm = conn.prepareCall("update Bill set Amount = ?, CollectorID = ?, Paid = ?, DatePaid = ? where BillID = ?");

            psttm.setDouble(1, ts.getAmount());

            if (ts.isPaid()) {
                psttm.setString(2, ts.getCollectorID());
                psttm.setInt(3, 1);
            }else{
                psttm.setNull(2, java.sql.Types.VARCHAR);
                psttm.setInt(3, 0);
            }

            if (ts.isPaid()) {
                psttm.setDate(4, new Date(System.currentTimeMillis()));
            }else{
                psttm.setNull(4, java.sql.Types.DATE);
            }

            psttm.setInt(5, billID);

            //Gọi lệnh executeUpdate để thực hiện lệnh insert trong SQL
            psttm.executeUpdate();

            psttm.close();

            return true;
        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }
    }

    public String login(Connection conn, String userName){
        try {
            if (conn != null) {
                // Chuỗi chứa lệnh select staff copy từ SQL,
                // ở cuối có thêm "where" sau đó ta sẽ cộng chuỗi để hoàn thành lệnh select
                // Copy và Sửa cái này(copy lệnh select từ SQL vd select Patient)
                String select = "select Password from Staff where Username = ";

                Statement sttm = conn.createStatement();

                //Tùy vào searchBy được truyền vào mà cộng chuỗi để hoàn thành lệnh select
                // Sau lệnh Switch này ta sẽ có một câu lệnh select chính xác
                // Copy và sửa cái này, xem trên PiakLife xem các bảng khác Search theo cái gì
                // trong combo box(VD: patient có ID, Full Name)
                select += "'" + userName + "'";

                // Lấy ra ResultSet
                ResultSet rs = sttm.executeQuery(select);

                PikaTableModel model = new PikaTableModel();

                String pass = null;

                if (rs.next()) {
                    pass = rs.getString(1);
                }

                // Ngắt các kết nối tới database
                rs.close();
                sttm.close();

                return pass;
            }

            return null;
        } catch (SQLException ex) {
            Logger.getLogger(DBManagerment.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }

    }

}
